
package com.x52im.rbchat.logic.sns_friend;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.NewAsyncTask;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.WidgetUtils.ToastType;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.im.dto.CMDBody4ProcessFriendRequest;
import com.x52im.rbchat.network.http.async.QueryFriendInfo;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.chat_friend.utils.MessageHelper;
import com.x52im.rbchat.utils.IntentFactory;

import java.text.MessageFormat;
import java.util.ArrayList;

/**
 * 好友请求消息的处理Activity.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class FriendReqProcessActivity extends DataLoadableActivity {

	private static String TAG = FriendReqProcessActivity.class.getSimpleName();
	
	public final static String RESULT_EXTRA_IDENT_PROCESSED_UID = "__friendInfoForInit__";

	/** 标签组件：好友的昵称 */
	private TextView viewNickname = null;
	/** 标签组件：好友的uid */
	private TextView viewUid = null;
	/** 标签组件：验证说明 */
	private TextView viewBz = null;
	
	/** 图片组件：头像 */
	private ImageView viewFace = null;
	
	/** 按钮：同意*/
	private Button btnAgree = null;
	/** 按钮：拒绝*/
	private Button btnReject = null;
	
	/** 组件：个人信息*/
	private LinearLayout friendInfoLL = null;
	
	// 本变量目前仅用于Activity被create时从Intent中取出来的聊天好友信息对象.
	/**
	 * 为何不直接在 initDataFromIntent()方法中调用switchToFriends(..)呢？
	 * 原因在于，该方法里需要用到ui组件，而在initDataFromIntent()方法中Activity
	 * 的ui组件还没有初始化完毕，所以只能先暂存，然后再在后绪方法中使用即可 */
	private RosterElementEntity friendInfoForInit = null; 
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void initDataFromIntent() {
		//解析从intent中传过来的数据
		ArrayList intentDatas = IntentFactory.parseFriendReqProcessIntent(getIntent());
		friendInfoForInit = (RosterElementEntity)intentDatas.get(0);
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中实现自已的UI显示逻辑。
	 */
	@Override
	protected void initViews(Bundle savedInstanceState) {
		// 设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
		customeTitleBarResId = R.id.sns_friend_request_process_form_titleBar;
		// 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
		setContentView(R.layout.sns_friend_request_process_form);
		
		// 初始化各种组件
		viewNickname = findViewById(R.id.sns_friend_request_process_form_nicknameView);
		viewUid = findViewById(R.id.sns_friend_request_process_form_uidAndMailView);
		viewBz = findViewById(R.id.sns_friend_request_process_form_bzView);
		btnAgree = findViewById(R.id.sns_friend_request_process_form_agreeBtn);
		btnReject = findViewById(R.id.sns_friend_request_process_form_rejectBtn);
		viewFace = findViewById(R.id.sns_friend_request_process_form_faceView);
		friendInfoLL = findViewById(R.id.sns_friend_request_person_info_LL);
		
		// 设置标题
		this.setTitle(R.string.sns_friend_request_process_form_title);
		//
		this.setLoadDataOnCreate(false);
		
		// 根据Intent中传过来的U友信息数据，刷新UI界面显示
		this.refreshToView(friendInfoForInit);

		// 显示用户头像
		ImageCacheLoader.loadAvatarImgWithGlide(this, friendInfoForInit.getUser_uid(), friendInfoForInit.getUserAvatarFileName()
				, viewFace, 30, R.drawable.default_avatar_yuan_60_3x, true, true);
	}
	
	// 本方法返回要提交到服务端的处理加好友请求的元数据
	private CMDBody4ProcessFriendRequest getProcessFriendRequestMeta() {
		RosterElementEntity local = MyApplication.getInstance(FriendReqProcessActivity.this).getIMClientManager().getLocalUserInfo();
		
		// 要提交到服务端的处理加好友请求数据
		CMDBody4ProcessFriendRequest pfrm = new CMDBody4ProcessFriendRequest();
		pfrm.setLocalUserUid(local.getUser_uid());
		pfrm.setSrcUserUid(friendInfoForInit.getUser_uid());
		pfrm.setLocalUserNickName(local.getNickname());
		
		return pfrm; 
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
	 */
	@Override
	protected void initListeners()
	{
		btnAgree.setOnClickListener(v -> {
			RosterElementEntity local = MyApplication.getInstance(
					FriendReqProcessActivity.this).getIMClientManager().getLocalUserInfo();
			// 系统允许的最多好同时拥有的好友数
			int maxFriend = CommonUtils.getIntValue(local==null?"1":local.getMaxFriend(), 1);

			// 要处理的该好友已经存在于好友列表中了（那就不需要再发往服务端去处理了）
			if(MyApplication.getInstance(FriendReqProcessActivity.this)
					.getIMClientManager().getFriendsListProvider().isUserInRoster(friendInfoForInit.getUser_uid()))
			{
				WidgetUtils.showToastLong(FriendReqProcessActivity.this,
						MessageFormat.format($$(R.string.sns_friend_request_process_form_tip), friendInfoForInit.getNickname()), ToastType.INFO);

				//** Bug FIX 20170406: 注销掉以下代码用于解决好加友请求在已是好友的情况下，不提
				//** 		                           交服务端处理已经存在历史请求，而导致该请求一直存在DB中的问题
//					// 退出当前界面
//					setResultImpl();
//					finish();
//					return;
				//** Bug FIX 20170406: END
			}
			// 只允许与N个人结成伴侣关系！
			else if(MyApplication.getInstance(FriendReqProcessActivity.this).getIMClientManager().getFriendsListProvider().size() >= maxFriend) {
				new AlertDialog.Builder(FriendReqProcessActivity.this)
					.setTitle(MessageFormat.format($$(R.string.sns_friend_request_process_form_only_one_friend_tip), maxFriend))
					.setMessage(MessageFormat.format($$(R.string.sns_friend_request_process_form_only_one_friend_message), maxFriend))
					.setPositiveButton(R.string.general_ok, null)
					.show();
				return;
			}

			// 新聊天框架中的网络数据发送需要放到异步线程里
			new NewAsyncTask<Object, Integer, Integer>() {
				@Override
				protected Integer doInBackground(Object... params) {
					int code = MessageHelper.sendProcessAdd$Friend$Req_B$To$Server_AGREEMessage(FriendReqProcessActivity.this, getProcessFriendRequestMeta());
					return code;
				}

				@Override
				protected void onPostExecute(Integer code) {
					if (code == 0) {
						setResultImpl();
						finish();
					} else {
						WidgetUtils.showToast(FriendReqProcessActivity.this, $$(R.string.sns_friend_request_process_form_send_request_failure_tip), ToastType.WARN);
					}
				}
			}.execute();
		});

		btnReject.setOnClickListener(v -> {
			// 要处理的该好友已经存在于好友列表中了（那就不需要再发往服务端去处理了）
			if(MyApplication.getInstance(FriendReqProcessActivity.this)
					.getIMClientManager().getFriendsListProvider().isUserInRoster2(friendInfoForInit.getUser_uid()))
			{
				WidgetUtils.showToastLong(FriendReqProcessActivity.this,
						MessageFormat.format($$(R.string.sns_friend_request_process_form_tip), friendInfoForInit.getNickname()),
						ToastType.INFO);

				//** Bug FIX 20170406: 注销掉以下代码用于解决好加友请求在已是好友的情况下，不提
				//** 		                           交服务端处理已经存在历史请求，而导致该请求一直存在DB中的问题
//					// 退出当前界面
//					setResultImpl();
//					finish();
//					return;
				//** Bug FIX 20170406: END
			}

			// 新聊天框架中的网络数据发送需要放到异步线程里（Android2.3以上版本要求网络交互不允许发生在主线程里）
			new NewAsyncTask<Object, Integer, Integer>() {
				@Override
				protected Integer doInBackground(Object... params) {
					int code = MessageHelper.sendProcessAdd$Friend$Req_B$To$Server_REJECTMessage(FriendReqProcessActivity.this, getProcessFriendRequestMeta());
					return code;
				}

				@Override
				protected void onPostExecute(Integer code) {
					if (code == 0) {
						WidgetUtils.showToast(FriendReqProcessActivity.this, MessageFormat.format($$(R.string.sns_friend_request_process_form_refuse_friend_request), friendInfoForInit.getNickname(), friendInfoForInit.getUser_uid()), ToastType.OK);
						// 请求发出后就立即退出当前界面
						setResultImpl();
						finish();
					} else {
						WidgetUtils.showToast(FriendReqProcessActivity.this, MessageFormat.format($$(R.string.sns_friend_request_process_form_refuse_friend_request_failure), friendInfoForInit.getNickname(), friendInfoForInit.getUser_uid()), ToastType.WARN);
					}
				}
			}.execute();
		});
		
		// 查看该用户的个人信息
		friendInfoLL.setOnClickListener(v -> {
//			new QueryFriendInfo(FriendReqProcessActivity.this).execute(false, null,friendInfoForInit.getUser_uid());
			QueryFriendInfo.gotoWatchUserInfo(self(), friendInfoForInit.getUser_uid(), null);
		});
	}
	
	/** 
	 * 设置回调.
	 */
	private void setResultImpl() {
		Intent intent=new Intent();
		intent.putExtra(RESULT_EXTRA_IDENT_PROCESSED_UID, friendInfoForInit.getUser_uid());// 将当前处理的好友uid通过回调传给父Activity
		setResult(RESULT_OK, intent);
	}

	//--------------------------------------------------------------------------------------------
	/**
	 * 从服务端查询数据并返回.
	 * 
	 * @param params loadData中传进来的参数，本类中该参数没有被用到
	 */
	@Override
	protected DataFromServer queryData(String... params) {
		return null;
	}

	//将已构造完成的完整的明细数据放入列表中显示出来
	@Override
	protected void refreshToView(Object dataToView) {
		if (dataToView != null && dataToView instanceof RosterElementEntity) {
			RosterElementEntity friendInfo = (RosterElementEntity) dataToView;

			viewNickname.setText(friendInfo.getNickname());
			viewUid.setText(friendInfo.getUser_uid());
			// 如果加好友验证消息不为空则设置之
			if (!CommonUtils.isStringEmpty(String.valueOf(friendInfoForInit.getEx1())))
				// 自20140213 RainbowChat2.22.2（含）以后ex1作为服务端转发加好友请求（给B）时存放验证说明文本使用（包括离线消息）
				viewBz.setText(String.valueOf(friendInfoForInit.getEx1()));
		} else {
			Log.w(TAG, "dateToView=" + dataToView);
			WidgetUtils.showToast(FriendReqProcessActivity.this, "dateToView=" + dataToView, ToastType.WARN);
		}
	}
}
